package main

import (
	"encoding/json"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

/*
多对多： 双向的一对多，需要第三张表进行来维护
案列: 学生和课程
*/
//2.定义多对多表结构--方法一 通过many2many方法定义第三张表
type StuInfo struct {
	gorm.Model
	StuName string
	/*
		ClassInfos 字段名
		gorm:"many2many 指定了StudentInfo表和ClassInfo表是多对多的关系
		StudentToClass  第三张表的表名 自定义即可，存放的是多对多的关系
	*/
	ClassInfos []ClassInfo `gorm:"many2many:StudentToClass;"`
}
type ClassInfo struct {
	gorm.Model
	Lesson string
}

//2.定义多对多表结构--方法二 自定义第三张表
//type StuInfo struct {
//	gorm.Model
//  Id uint
//	StuName string `gorm:"many2many:StuInfo_ClassInfo;"`
//}
//type ClassInfo struct {
//	gorm.Model
//  Id uint
//	Lesson string
//}
////第三张表
//type profile struct {
//	gorm.Model
//	StuInfoId uint `gorm:"primaryKey"`  对应表的主键
//	ClassInfoId uint `gorm:"primaryKey"`
//}
////	3、创建表  自动迁移指的是把userinfo结构体和数据表进行对应
//	db.AutoMigrate(&StuInfo{}, &ClassInfo{},&profile{})
func main() {
	//	1、连接mysql数据库
	dsn := "root:123@tcp(127.0.0.1:3306)/db2?charset=utf8&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)

	}
	//	3、创建表  自动迁移指的是把userinfo结构体和数据表进行对应
	db.AutoMigrate(&StuInfo{}, &ClassInfo{})
	//4.1创建多对多关联表
	//user := StuInfo{
	//	StuName: "李四",
	//	ClassInfos: []ClassInfo{
	//		{Lesson: "golang"},
	//		{Lesson: "vue"},
	//	},
	//}
	//db.Create(&user)
	//4.3关联表查找数据 --Association方法 需要把需要的用户查询好，然后根据用户中定义的关联外键去找到Card
	user := StuInfo{StuName: "李四"}
	db.First(&user)
	if err := db.Model(&user).Association("ClassInfos").Find(&user.ClassInfos); err != nil {
		panic(err)
	}
	//将数据序列化为json格式
	if strUser, err := json.Marshal(&user); err != nil {
		panic(err)
	} else {
		fmt.Println(string(strUser))
	}
}
